package zhh;

import zhh.check.CheckHandler;
import zhh.check.impl.AgeCheck;
import zhh.check.impl.HeightCheck;
import zhh.check.impl.NameCheck;
import zhh.check.impl.WeightCheck;
import zhh.person.Person;

/**
 * 责任链模式（Chain of Responsibility Pattern）是一种行为设计模式，
 * 它允许你将请求的处理分散到一系列处理对象中，这些对象形成一个链条。每个对象都有机会处理请求，
 * 如果能够处理则处理它，否则将请求传递给链条中的下一个对象。
 * 这个过程会一直持续，直到请求被处理或者到达链的末端。
 */
public class Main {
    /**
     * 责任链就是将对一个对象的校验从多个if拆分成多个逻辑执行对象
     * 优化掉了陈杂的if语句并降低了校验逻辑和其他业务逻辑的耦合度
     * 提高了校验功能的可扩展性
     * 同时责任链的各个节点还可以任意顺序进行组装
     */
    public static void main(String[] args) {
        // 下面以校验一个人类的信息为例
        Person zhouHuiHui = getPerson();
        CheckHandler handler = getCheckHandler();
        boolean 传统校验 = 传统校验(zhouHuiHui);
        System.out.println("传统校验：" + 传统校验);

        boolean 责任链校验 = handler.check(zhouHuiHui);
        System.out.println("责任链校验：" + 责任链校验);

    }


    public static Person getPerson() {
        return new Person(
                "粥灰灰",
                18,
                50.5f,
                1.7f,
                1,
                true,
                1
        );
    }

    /**
     * 传统校验方法
     */
    public static boolean 传统校验(Person person) {
        if (person.getName() == null) {
            return false;
        }
        if (person.getAge() < 18) {
            return false;
        }
        if (person.getWeight() <= 50) {
            return false;
        }
        if (person.getHeight() <= 1.5) {
            return false;
        }
        return true;
    }

    /**
     * 创建检查链
     */
    public static CheckHandler getCheckHandler() {
        // 头插法创建链式检查链
        CheckHandler heightCheck = new HeightCheck();
        CheckHandler weightCheck = new WeightCheck(heightCheck);
        CheckHandler ageCheck = new AgeCheck(weightCheck);
        return new NameCheck(ageCheck);
    }
}